74. Search a 2D Matrix

题目 74. Search a 2D Matrix

image-70b5a8b5

思路分析

首先想法是

  • 对第一列进行二分:找到最后一个满足 matrix[i][0] <= target 的行索引 row
  • 对该行进行二分:在 matrix[row] 这个数组里查找 target

其实观察可以发现 其实按照先行再列的顺序走下去 他也是递增的 可以2维转1维 只做一次二分

代码实现

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int m = matrix.length;
        int n = matrix[0].length;

        int top=0,bottom=m-1;
        int row = -1;
        while(top<=bottom){
            int mid = top+bottom>>1;
            if(matrix[mid][0]<=target){
                row=mid;
                top=mid+1;
            }else{
                bottom=mid-1;
            }
        }
        
        if(row == -1)   return false;

        int l=0,r=n-1;
        while(l<=r){
            int mid=l+r>>1;
            if(matrix[row][mid]==target){
                return true;
            }else if(matrix[row][mid]<target){
                l=mid+1;
            }else{
                r=mid-1;
            }
        }

        return false;
    }
}
class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int m=matrix.length;
        int n=matrix[0].length;

        int l=0,r=m*n-1;
        while(l<=r){
            int mid=l+r>>1;
            int val=matrix[mid/n][mid%n];
            if(val==target){
                return true;
            }else if(val<target){
                l=mid+1;
            }else{
                r=mid-1;
            }
        }

        return false;
    }
}

同类题型

视频讲解